<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    /* 
    产生闭包3个条件
      1. 函数嵌套
      2. 内部函数使用外部函数的局部变量
      3. 调用外部函数
    闭包:
      包含被引用变量的对象
      它被内部函数引入着
    产生闭包的时机:
      执行内部函数定义/产生内部函数对象
    使用闭包
      执行内部函数(通过外部引用来执行)
    释放闭包
      将指向内部函数的外部引用变量赋为null
    闭包的作用:
      延长了局部变量的生命周期
      能在外部反复使用到局部变量数据
    */
    function fn1() {
      var a = 2
      var b = 3
      function fn2() {
        a++
        console.log(a)
      }
      return fn2
    }
    const fn = fn1()  // 产生闭包
    fn() // 3   // 使用闭包
    fn() // 4   // 使用闭包

    fn = null // 释放闭包


    // IIFE

    (() => {
      var data = 3

      function fn() {
        data++
      }
      window.fn = fn
    })

    fn()
    fn()
    window.fn = null
  </script>
</body>
</html>